package trocabi.DAO;

import trocabi.Socle.DBManager;
import trocabi.model.Depositaire;
import trocabi.Socle.TechnicalException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Logger;
import trocabi.Socle.StringTools;

public class DAODepositaire extends DAO<ArrayList<Depositaire>, Depositaire> {
    private static final Logger         logger = Logger.getLogger("trocabi.DAO.DAODepositaire");
    private static       DAODepositaire instance=null;
    
    // Identifiants relatifs à la table des dépositaires
    public static final String TB_DEPOSITAIRE = "DEPOSITAIRE";
    public static final String FD_ID          = "NUMERO_DEPOSITAIRE";
    public static final String FD_NOM         = "NOM";
    public static final int    FD_NOM_SIZE    = 50;
    public static final String FD_PRENOM      = "PRENOM";
    public static final int    FD_PRENOM_SIZE = 50;
    public static final String FD_TELFIX      = "TELEPHONE_FIXE";
    public static final int    FD_TELFIX_SIZE = 10;
    public static final String FD_TELPORTABLE = "TELEPHONE_PORTABLE";
    public static final int    FD_TELPORTABLE_SIZE=10;
    public static final String FD_RUE         = "RUE";
    public static final int    FD_RUE_SIZE    = 200;
    public static final String FD_VILLE       = "VILLE";
    public static final int    FD_VILLE_SIZE  = 50;
    public static final String FD_CP          = "CODE_POSTAL";
    public static final int    FD_CP_SIZE     = 5;
    public static final String FD_IDCARD      = "NUMERO_CARTE_IDENTITE";
    public static final int    FD_IDCARD_SIZE = 12;
    //Variable nécessaire aux requêtes SQL
    private static String sSqlQuery;
    public static final String sEGAL_STRICT = " = ";
    public static final String sINFERIEUR_STRICT = " < ";
    public static final String sSUPERIEUR_STRICT = " > ";
    public static final String sINFERIEUR = " <= ";
    public static final String sSUPERIEUR = " >=";
    public static final String sCONTENANT = " LIKE ";
    public static final String sDIFFERENT = " <> ";
    public static final String sCROISSANT = " ASC ";
    public static final String sDECROISSANT = " DESC ";
    //Varibles liées aux conditions de mises à jour et de sélection
    public static final int iID_DB = 0;
    public static final int iVALEUR = 1;
    public static final int iMODE_COMPARAISON = 2;
    public static final int iMODE_TRIE = 3;
    public static final int iINFO_AFFICHEE = 0;
    public static final int iDISTINCT = 1;
    public static final String sDISTINCT_OK = "OK";
    public static final String sNO_DISTINCT = "NO";
    public static final int iNO_LIMIT = 0;

    private DAODepositaire() { 
    }
    
    public static synchronized DAODepositaire getInstance() {
        if (instance==null) {
            instance=new DAODepositaire();
        }
        return instance;
    }
    
    @Override
    public Depositaire get(long id) throws TechnicalException{
        Depositaire depositaire=null;
        Statement   statement;

        try { 
            statement = DBManager.getConnection().createStatement();
            String query=String.format("SELECT * FROM %s WHERE %s=%d",TB_DEPOSITAIRE,FD_ID,id);
            ResultSet rsResult = statement.executeQuery(query);
            if (rsResult.first()) {
                    depositaire=new Depositaire(rsResult.getLong(FD_ID),
                            StringTools.unEscape(rsResult.getString(FD_NOM)),
                            StringTools.unEscape(rsResult.getString(FD_PRENOM)),
                            rsResult.getString(FD_TELFIX),
                            rsResult.getString(FD_TELPORTABLE),
                            StringTools.unEscape(rsResult.getString(FD_RUE)),
                            StringTools.unEscape(rsResult.getString(FD_VILLE)),
                            rsResult.getString(FD_CP),
                            rsResult.getString(FD_IDCARD));
            }
        } catch (SQLException | TechnicalException e) {
            logger.severe(String.format("%s %s",e.getLocalizedMessage(),e.getMessage()));
            throw new TechnicalException(e.getMessage(),e.getCause());
        }
        return depositaire;
    }
    @Override
    public long insert(Depositaire depositaire) throws TechnicalException {
        Statement statement;
        long      id;
        
        try {
            statement = DBManager.getConnection().createStatement(); // TODO: String avec '
            String query=String.format("INSERT INTO %s (%s,%s,%s,%s,%s,%s,%s,%s) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s');",
                    TB_DEPOSITAIRE,
                    FD_NOM, FD_PRENOM, FD_TELFIX,FD_TELPORTABLE,
                    FD_RUE,FD_VILLE,FD_CP,
                    FD_IDCARD,
                    StringTools.escape(depositaire.getNom()), 
                    StringTools.escape(depositaire.getPrenom()), 
                    depositaire.getTelFixe(),depositaire.getTelPortable(),
                    StringTools.escape(depositaire.getLibelleRue()), 
                    StringTools.escape(depositaire.getLibelleVille()), 
                    depositaire.getCodePostal(),
                    depositaire.getIdCard());
            id =  statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
            ResultSet rs = statement.getGeneratedKeys();
            if (rs.next()){
                id=rs.getInt(1);
            }
            DBManager.getConnection().commit();
        } catch (SQLException | TechnicalException e) {
            logger.severe(String.format("%s %s", e.getLocalizedMessage(), e.getMessage()));
            throw new TechnicalException(e.getMessage(),e.getCause());
        }
        return id;
    }
    
    @Override
     public void update(Depositaire depositaire) throws TechnicalException {
        Statement statement;
        long      id;
        
        try {
            statement = DBManager.getConnection().createStatement(); // TODO: String avec '
           //  String query=String.format("INSERT INTO %s (%s,%s,%s,%s,%s,%s,%s,%s) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s');",
            String query=String.format("UPDATE %s SET %s='%s',%s='%s',%s='%s',%s='%s',%s='%s',%s='%s',%s='%s',%s='%s' WHERE %s=%d;",
                    TB_DEPOSITAIRE,
                    FD_NOM,   StringTools.escape(depositaire.getNom()),       FD_PRENOM,      StringTools.escape(depositaire.getPrenom()), 
                    FD_TELFIX,depositaire.getTelFixe(),   FD_TELPORTABLE, depositaire.getTelPortable(),
                    FD_RUE,   StringTools.escape(depositaire.getLibelleRue()),FD_VILLE,       StringTools.escape(depositaire.getLibelleVille()),
                    FD_CP,    depositaire.getCodePostal(),FD_IDCARD,      depositaire.getIdCard(),
                    FD_ID,    depositaire.getId());
                    
            id =  statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
            DBManager.getConnection().commit();
        
        } catch (SQLException | TechnicalException e) {
            logger.severe(String.format("%s %s", e.getLocalizedMessage(), e.getMessage()));
            throw new TechnicalException(e.getMessage(),e.getCause());
        }
    }
   
    public ArrayList<Depositaire> search(String query) throws TechnicalException {
        ArrayList<Depositaire>  depositaires = new <Depositaire>ArrayList();
        Statement               statement;

        try {
            statement = DBManager.getConnection().createStatement();
            ResultSet rsResult = statement.executeQuery(query);
            if (rsResult.first()) {
                do {
                    Depositaire depositaire=new Depositaire(rsResult.getLong(FD_ID),
                            StringTools.unEscape(rsResult.getString(FD_NOM)),
                            StringTools.unEscape(rsResult.getString(FD_PRENOM)),
                            rsResult.getString(FD_TELFIX),
                            rsResult.getString(FD_TELPORTABLE),
                            StringTools.unEscape(rsResult.getString(FD_RUE)),
                            StringTools.unEscape(rsResult.getString(FD_VILLE)),
                            rsResult.getString(FD_CP),
                            rsResult.getString(FD_IDCARD));
                    depositaires.add(depositaire);
                } while (rsResult.next());
            }
        } catch (SQLException | TechnicalException e) {
            logger.severe(String.format("%s %s",e.getLocalizedMessage(),e.getMessage()));
            throw new TechnicalException(e.getMessage(),e.getCause());
        }
        return depositaires;
    }
    //Permet de créer un dépositaire
    /*
    @Override
    public boolean bCreate(Depositaire depDepositaire) {
        int       iRetour;
        try {      
            Statement statement=null;
            if (depDepositaire.getId() < 0) return false;
           
            statement = DBManager.getConnection().createStatement();
            sSqlQuery = "INSERT INTO " + TB_DEPOSITAIRE + " ( " + FD_ID + "," + FD_NOM + "," + FD_PRENOM + ",";
            //Argument facultatif
            if (depDepositaire.getTelFixe() != null) {
                sSqlQuery = sSqlQuery + FD_TELFIX + ",";
            }
            //Argument facultatif
            if (depDepositaire.getTelPortable() != null) {
                sSqlQuery = sSqlQuery + FD_TELPORTABLE + ",";
            }
            sSqlQuery = sSqlQuery + FD_RUE + "," + FD_VILLE + "," + FD_CP + ","
                    + FD_IDCARD + ") VALUES (" + depDepositaire.getId() + ",'"
                    + depDepositaire.getNom().toLowerCase() + "','" + depDepositaire.getPrenom().toLowerCase() + "','";
            //Argument facultatif
            if (depDepositaire.getTelFixe() != null) {
                sSqlQuery = sSqlQuery + depDepositaire.getTelFixe() + "','";
            }
            //Argument facultatif
            if (depDepositaire.getTelPortable() != null) {
                sSqlQuery = sSqlQuery + depDepositaire.getTelPortable() + "','";
            }
            sSqlQuery = sSqlQuery + depDepositaire.getLibelleRue().toLowerCase() + "','" + depDepositaire.getLibelleVille().toLowerCase() + "','"
                    + depDepositaire.getCodePostal() + "','" + depDepositaire.getIdCard() + "');";
            iRetour =  statement.executeUpdate(sSqlQuery, Statement.RETURN_GENERATED_KEYS);
            DBManager.getConnection().commit();
            if (iRetour != 1) {
                return false;
            }
            return true;
        } catch (Exception exException) {
            return false;
        }
    }
*/
    //Permet de supprimer un dépositaire
    @Override
    public boolean bDelete(long iNum_Depositaire) {
        Statement statement=null;
        boolean            result=false;
        
        try {
            int iRetour;
            statement = DBManager.getConnection().createStatement();
            sSqlQuery = "DELETE FROM " + TB_DEPOSITAIRE + " WHERE " + FD_ID + " = '" + iNum_Depositaire + "';";
            iRetour = statement.executeUpdate(sSqlQuery, Statement.RETURN_GENERATED_KEYS);
            DBManager.getConnection().commit();
            result=iRetour == 1;  
        } catch (TechnicalException | SQLException e) {};
        return result;
    }
    /*
    //Permet de mettre à jour un dépositaire
    @Override
    public boolean bUpdate(ArrayList<String[]> listListeUpdate, ArrayList<String[]> listListeConditions) {
        Statement statement=null;
        int ilongueur_Minimale;
        int iRetour;
        try {
            if (listListeUpdate == null || listListeUpdate.isEmpty() == true || listListeConditions == null || listListeConditions.isEmpty() == true) {
                return false;
            }
            statement = DBManager.getConnection().createStatement();
            sSqlQuery = "UPDATE " + TB_DEPOSITAIRE + " SET ";
            ilongueur_Minimale = sSqlQuery.length();
            while (listListeUpdate.size() > 0) {
                if (listListeUpdate.get(0)[iID_DB].equals(FD_ID)) {
                    return false;
                }
                if (sSqlQuery.length() == ilongueur_Minimale) {
                    sSqlQuery = sSqlQuery + listListeUpdate.get(0)[iID_DB] + " = '" + listListeUpdate.get(0)[iVALEUR].toLowerCase() + "'";
                    listListeUpdate.remove(0);
                } else {
                    sSqlQuery = sSqlQuery + " , " + listListeUpdate.get(0)[iID_DB] + " = '" + listListeUpdate.get(0)[iVALEUR].toLowerCase() + "'";
                    listListeUpdate.remove(0);
                }
            }
            ilongueur_Minimale = sSqlQuery.length();
            while (listListeConditions.size() > 0) {
                if (listListeConditions.get(0)[iMODE_COMPARAISON] != null) {
                    if (sSqlQuery.length() == ilongueur_Minimale) {
                        if (listListeConditions.get(0)[iID_DB].equals(FD_ID)) {
                            if (listListeConditions.get(0)[iMODE_COMPARAISON].equals(sCONTENANT)) {
                                return false;
                            }
                            sSqlQuery = sSqlQuery + " WHERE " + listListeConditions.get(0)[iID_DB] + listListeConditions.get(0)[iMODE_COMPARAISON] + listListeConditions.get(0)[iVALEUR].toLowerCase();
                        } else {
                            if (listListeConditions.get(0)[iMODE_COMPARAISON].equals(sCONTENANT)) {
                                sSqlQuery = sSqlQuery + " WHERE " + listListeConditions.get(0)[iID_DB] + listListeConditions.get(0)[iMODE_COMPARAISON] + "'%" + listListeConditions.get(0)[iVALEUR].toLowerCase() + "%'";
                            } else {
                                sSqlQuery = sSqlQuery + " WHERE " + listListeConditions.get(0)[iID_DB] + listListeConditions.get(0)[iMODE_COMPARAISON] + "'" + listListeConditions.get(0)[iVALEUR].toLowerCase() + "'";
                            }
                        }
                        listListeConditions.remove(0);
                    } else {
                        if (listListeConditions.get(0)[iID_DB].equals(FD_ID)) {
                            if (listListeConditions.get(0)[iMODE_COMPARAISON].equals(sCONTENANT)) {
                                return false;
                            }
                            sSqlQuery = sSqlQuery + " AND " + listListeConditions.get(0)[iID_DB] + listListeConditions.get(0)[iMODE_COMPARAISON] + listListeConditions.get(0)[iVALEUR].toLowerCase();
                        } else {
                            if (listListeConditions.get(0)[iMODE_COMPARAISON].equals(sCONTENANT)) {
                                sSqlQuery = sSqlQuery + " AND " + listListeConditions.get(0)[iID_DB] + listListeConditions.get(0)[iMODE_COMPARAISON] + "'%" + listListeConditions.get(0)[iVALEUR].toLowerCase() + "%'";
                            } else {
                                sSqlQuery = sSqlQuery + " AND " + listListeConditions.get(0)[iID_DB] + listListeConditions.get(0)[iMODE_COMPARAISON] + "'" + listListeConditions.get(0)[iVALEUR].toLowerCase() + "'";
                            }
                        }
                        listListeConditions.remove(0);

                    }
                } else {
                    return false;
                }
            }
            sSqlQuery = sSqlQuery + ";";
            iRetour = statement.executeUpdate(sSqlQuery, Statement.RETURN_GENERATED_KEYS);
            if (iRetour != 1) {
                return false;
            }
            DBManager.getConnection().commit();
            return true;
        } catch (Exception exException) {
            return false;
        }
    }
*/
    //Permet de sélectioner un dépositaire sur 255 critères
    @Override
    public ArrayList<Depositaire> listSelect(ArrayList<String[]> listListeConditions, ArrayList<String[]> listListeInfos_Affichees, int limite) {
        Statement statement=null;
        int       ilongueur_Minimale;
        
        try {    
            statement = DBManager.getConnection().createStatement();
            sSqlQuery = "SELECT";
            if (listListeInfos_Affichees == null || listListeInfos_Affichees.isEmpty()) {
                sSqlQuery = sSqlQuery + " *";
            } else {
                int iIndice = 0;
                ArrayList<String[]> listListeInfos_Affichees_Distinctes = new <String[]>ArrayList();
                while (iIndice <= listListeInfos_Affichees.size()) {
                    if (listListeInfos_Affichees.get(iIndice)[iDISTINCT].equals(sDISTINCT_OK)) {
                        listListeInfos_Affichees_Distinctes.add(listListeInfos_Affichees.get(iIndice));
                        listListeInfos_Affichees.remove(iIndice);
                    }
                    iIndice++;
                }
                if (listListeInfos_Affichees_Distinctes.isEmpty() == false) {
                    sSqlQuery = sSqlQuery + " DISTINCT (";
                    ilongueur_Minimale = sSqlQuery.length();
                    while (listListeInfos_Affichees_Distinctes.size() > 0) {
                        if (sSqlQuery.length() == ilongueur_Minimale) {
                            sSqlQuery = sSqlQuery + listListeInfos_Affichees_Distinctes.get(0)[iINFO_AFFICHEE];
                            listListeInfos_Affichees_Distinctes.remove(0);
                        } else {
                            sSqlQuery = sSqlQuery + ", " + listListeInfos_Affichees_Distinctes.get(0)[iINFO_AFFICHEE];
                            listListeInfos_Affichees_Distinctes.remove(0);
                        }
                    }
                    sSqlQuery = sSqlQuery + " )";


                }
                ilongueur_Minimale = sSqlQuery.length();
                while (listListeInfos_Affichees.size() > 0) {
                    if (sSqlQuery.length() == ilongueur_Minimale) {
                        sSqlQuery = sSqlQuery + " " + listListeInfos_Affichees.get(0)[iINFO_AFFICHEE];
                        listListeInfos_Affichees.remove(0);
                    } else {
                        sSqlQuery = sSqlQuery + ", " + listListeInfos_Affichees.get(0)[iINFO_AFFICHEE];
                        listListeInfos_Affichees.remove(0);
                    }
                }
            }
            sSqlQuery = sSqlQuery + " FROM " + TB_DEPOSITAIRE;
            ilongueur_Minimale = sSqlQuery.length();
            int iI = 0;
            while (listListeConditions != null && iI < listListeConditions.size()) {
                if (listListeConditions.get(iI)[iMODE_COMPARAISON] != null) {
                    if (sSqlQuery.length() == ilongueur_Minimale) {
                        if (listListeConditions.get(iI)[iID_DB].equals(FD_ID)) {
                            if (listListeConditions.get(iI)[iMODE_COMPARAISON].equals(sCONTENANT)) {
                                return null;
                            }
                            sSqlQuery = sSqlQuery + " WHERE " + listListeConditions.get(iI)[iID_DB] + listListeConditions.get(iI)[iMODE_COMPARAISON] + listListeConditions.get(iI)[iVALEUR].toLowerCase();
                        } else {
                            if (listListeConditions.get(iI)[iMODE_COMPARAISON].equals(sCONTENANT)) {
                                sSqlQuery = sSqlQuery + " WHERE " + listListeConditions.get(iI)[iID_DB] + listListeConditions.get(iI)[iMODE_COMPARAISON] + "'%" + listListeConditions.get(iI)[iVALEUR].toLowerCase() + "%'";
                            } else {
                                sSqlQuery = sSqlQuery + " WHERE " + listListeConditions.get(iI)[iID_DB] + listListeConditions.get(iI)[iMODE_COMPARAISON] + "'" + listListeConditions.get(iI)[iVALEUR].toLowerCase() + "'";
                            }
                        }
                        if (listListeConditions.get(iI)[iMODE_TRIE] == null) {
                            listListeConditions.remove(iI);
                        } else {
                            iI++;
                        }
                    } else {
                        if (listListeConditions.get(iI)[iID_DB].equals(FD_ID)) {
                            if (listListeConditions.get(iI)[iMODE_COMPARAISON].equals(sCONTENANT)) {
                                return null;
                            }
                            sSqlQuery = sSqlQuery + " AND " + listListeConditions.get(iI)[iID_DB] + listListeConditions.get(iI)[iMODE_COMPARAISON] + listListeConditions.get(iI)[iVALEUR].toLowerCase();
                        } else {
                            if (listListeConditions.get(iI)[iMODE_COMPARAISON].equals(sCONTENANT)) {
                                sSqlQuery = sSqlQuery + " AND " + listListeConditions.get(iI)[iID_DB] + listListeConditions.get(iI)[iMODE_COMPARAISON] + "'%" + listListeConditions.get(iI)[iVALEUR].toLowerCase() + "%'";
                            } else {
                                sSqlQuery = sSqlQuery + " AND " + listListeConditions.get(iI)[iID_DB] + listListeConditions.get(iI)[iMODE_COMPARAISON] + "'" + listListeConditions.get(iI)[iVALEUR].toLowerCase() + "'";
                            }
                        }
                        if (listListeConditions.get(iI)[iMODE_TRIE] == null) {
                            listListeConditions.remove(iI);
                        } else {
                            iI++;
                        }
                    }
                } else {
                    if (listListeConditions.get(iI)[iVALEUR] != null) {
                        return null;
                    }
                    iI++;
                }
            }
            if (listListeConditions != null && listListeConditions.size() > 0) {
                sSqlQuery = sSqlQuery + " ORDER BY ";
                while (listListeConditions.size() > 0) {
                    sSqlQuery = sSqlQuery + listListeConditions.get(0)[iID_DB] + listListeConditions.get(0)[iMODE_TRIE];
                    listListeConditions.remove(0);
                }
            }
            if (limite > 0) {
                sSqlQuery = sSqlQuery + " LIMIT 0, " + String.valueOf(limite);
            }
            sSqlQuery = sSqlQuery + ";";
         
            ResultSet rsResult = statement.executeQuery(sSqlQuery);
            if (rsResult.first()) {
                int iNumero_Depositaire;
                String sNom_Depositaire;
                String sPrenom_Depositaire;
                String sTelephone_Fixe_Depositaire;
                String sTelephone_Portable_Depositaire;
                String sRue_Depositaire;
                String sVille_Depositaire;
                String sCode_Postal_Depositaire;
                String sNumero_Carte_Identite_Depositaire;
                ArrayList<Depositaire> listListe_Depositaire = new <Depositaire>ArrayList();
                Depositaire depDepositaire;
                do {
                    try {
                        iNumero_Depositaire = rsResult.getInt(FD_ID);
                    } catch (Exception exException_bis) {
                        iNumero_Depositaire = -1;
                    }
                    try {
                        sNom_Depositaire = rsResult.getString(FD_NOM);
                    } catch (Exception exException_bis) {
                        sNom_Depositaire = null;
                    }
                    try {
                        sPrenom_Depositaire = rsResult.getString(FD_PRENOM);
                    } catch (Exception exException_bis) {
                        sPrenom_Depositaire = null;
                    }
                    try {
                        sTelephone_Fixe_Depositaire = rsResult.getString(FD_TELFIX);
                    } catch (Exception exException_bis) {
                        sTelephone_Fixe_Depositaire = null;
                    }
                    try {
                        sTelephone_Portable_Depositaire = rsResult.getString(FD_TELPORTABLE);
                    } catch (Exception exException_bis) {
                        sTelephone_Portable_Depositaire = null;
                    }
                    try {
                        sRue_Depositaire = rsResult.getString(FD_RUE);
                    } catch (Exception exException_bis) {
                        sRue_Depositaire = null;
                    }
                    try {
                        sVille_Depositaire = rsResult.getString(FD_VILLE);
                    } catch (Exception exException_bis) {
                        sVille_Depositaire = null;
                    }
                    try {
                        sCode_Postal_Depositaire = rsResult.getString(FD_CP);
                    } catch (Exception exException_bis) {
                        sCode_Postal_Depositaire = null;
                    }
                    try {
                        sNumero_Carte_Identite_Depositaire = rsResult.getString(FD_IDCARD);
                    } catch (Exception exException_bis) {
                        sNumero_Carte_Identite_Depositaire = null;
                    }
                    depDepositaire = new Depositaire(iNumero_Depositaire, sNom_Depositaire, sPrenom_Depositaire, sTelephone_Fixe_Depositaire, sTelephone_Portable_Depositaire,
                            sRue_Depositaire, sVille_Depositaire, sCode_Postal_Depositaire, sNumero_Carte_Identite_Depositaire);
                    listListe_Depositaire.add(depDepositaire);
                } while (rsResult.next());
                return listListe_Depositaire;
            }
            return null;
        } catch (Exception exException) {
            return null;
        }
    }

    //Permet de renseigner le premier numéro disponible dans la table
    /*
    public long iNumero() {
        Statement   statement=null;
        int         iRetour;
        
        try {   
            ResultSet rsResult;
            //On initialise la variable du numéro théorique
            statement = DBManager.getConnection().createStatement();
            sSqlQuery = "SET @VAR = -1;";
            statement.executeUpdate(sSqlQuery, Statement.RETURN_GENERATED_KEYS);
            DBManager.getConnection().commit();
            //On crée une table temporaire contenant les numéros de comptes réels et les numéros de comptes théoriques
            statement = DBManager.getConnection().createStatement();
            sSqlQuery = "CREATE TEMPORARY TABLE TEMP SELECT " + FD_ID + " AS NUM_REEL, (@VAR := (@VAR + 1)) AS NUM_THEO FROM " + TB_DEPOSITAIRE + " ORDER BY NUM_REEL;";
            statement.executeUpdate(sSqlQuery, Statement.RETURN_GENERATED_KEYS);
            DBManager.getConnection().commit();
            //On sélectionne le premier numéro théorique différent de celui réel
            statement = DBManager.getConnection().createStatement();
            sSqlQuery = "SELECT MIN(NUM_THEO) AS NUMERO FROM TEMP WHERE NUM_REEL<>NUM_THEO;";
            rsResult = statement.executeQuery(sSqlQuery);
            rsResult.first();
            iRetour = rsResult.getInt("NUMERO");
            //Si le résultat est égal à 0 cela signifie qu'il n'y a pas de trou entre le dépositaire 0 et le dépositaire qui a le numéro de dépositaire le plus grand ou que le premier trou est positioné sur l'index 0
            if (iRetour == 0) {
                // On vérifie quelle est la cause du résultat 0
                statement = DBManager.getConnection().createStatement();
                sSqlQuery = "SELECT COUNT(NUM_REEL) AS NUMERO FROM TEMP WHERE NUM_REEL<>NUM_THEO;";
                rsResult = statement.executeQuery(sSqlQuery);
                rsResult.first();
                iRetour = rsResult.getInt("NUMERO");
                //S'il s'agit de la position de la première différence sur l'index 0 on retourne 0
                if (iRetour != 0) {
                    iRetour = 0;
                } // Sinon on récupère le nombre de compte pour avoir la place du compte à créer
                else {
                    statement = DBManager.getConnection().createStatement();
                    sSqlQuery = "SELECT COUNT(NUM_REEL) AS NUMERO FROM TEMP;";
                    rsResult = statement.executeQuery(sSqlQuery);
                    rsResult.first();
                    iRetour = rsResult.getInt("NUMERO");
                }
            }
            statement = DBManager.getConnection().createStatement();
            sSqlQuery = "DROP TEMPORARY TABLE TEMP";
            statement.executeUpdate(sSqlQuery, Statement.RETURN_GENERATED_KEYS);
            DBManager.getConnection().commit();
            return iRetour;
        } catch (Exception exException) {
            return -1;
        }
    }
    * */
}
